// let a = 1
// const b = 2

// a = 3
// b = 4


// function varTest() {
//   var x = 1
//   if (true) {
//     let x = 2
//     console.log(x);
//   }
//   console.log(x);
// }
// varTest()
//块级作用域内部声明的变量不影响外部的变量
//上下文对象的词法环境中会形成一个新的栈用来储存变量let x = 2，var x = 1储存在变量环境中
//函数找变量先从词法环境从上到下找再从变量环境找

function foo() {
  var a = 1
  let b = 2
  {
    let b = 3
    var c = 4
    let d = 5
    console.log(a);
    console.log(b);
  }
  console.log(b);
  console.log(c);
  // console.log(d);
}
foo()
//会把块级作用域变成块级上下文放入词法环境的栈中，运行完块级作用域之后会销毁
